공공데이터 포털에서 데이터 가져오기를 통해 입수한 데이터를 후속 시각화와 모형개발 작업을 위해 깔끔한 정제작업을 수행한다. 특히, 2020-11-06 중복된 행이 포함되어 중복 제거작업을 선행하여 처리한다. 2020-04-02 ~ 2020-04-06 사이 결측값이 있어 pad_by_time() 함수로 결측된 기간을 생성시키고 나서, ts_impute_vec() 함수로 선형보간(period = 1)을 통해 결측값을 채워넣어 정제작업이 완료된 데이터를 가지고 탐색적 데이터 작업을 수행한다.
library(tidyverse)
library(httr)
library(rvest)
library(glue)
library(lubridate)
covid_age_gender_df <- read_rds("data/covid_age_gender_clean.rds")
covid_age_gender_df# A tibble: 2,949 x 7
날짜 구분 검사자 확진자 사망자 감염율 치명율
<date> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2020-04-02 0-9 9825. 112 0 0.0114 0
2 2020-04-03 0-9 9925. 115. 0 NA NA
3 2020-04-04 0-9 10026. 118. 0 NA NA
4 2020-04-05 0-9 10127. 120. 0 NA NA
5 2020-04-06 0-9 10227. 123. 0 NA NA
6 2020-04-07 0-9 10328. 126 0 0.0122 0
7 2020-04-08 0-9 10413. 126 0 0.0121 0
8 2020-04-09 0-9 10407. 128 0 0.0123 0
9 2020-04-10 0-9 10488. 129 0 0.0123 0
10 2020-04-11 0-9 10484. 130 0 0.0124 0
# ... with 2,939 more rows
탐색적 데이터 분석을 통해 전반적인 추세를 살펴봄으로 인해 숨겨진 데이터의 오류도 찾아낼 수 있다.
library(timetk)
covid_age_daily_df <- covid_age_gender_df %>%
filter(날짜 >= "2020-04-09") %>%
filter(!str_detect(구분, pattern = "(남성)|(여성)")) %>%
timetk::summarise_by_time(.date_var = 날짜,
.by = "day",
누적검사자 = sum(검사자),
누적확진자 = sum(확진자),
누적사망자 = sum(사망자)
) %>%
mutate(누적사망자 = ifelse(between_time(날짜, start_date = "2020-08-02", end_date = "2020-08-03"), 301, 누적사망자),
누적사망자 = ifelse(날짜 == "2020-06-23", 280, 누적사망자)) %>%
mutate(검사자 = 누적검사자 - lag(누적검사자, n = 1L),
확진자 = 누적확진자 - lag(누적확진자, n = 1L),
사망자 = 누적사망자 - lag(누적사망자, n = 1L))
covid_age_daily_df %>%
select(-contains("누적")) %>%
pivot_longer(-날짜) %>%
plot_time_series(.date_var = 날짜,
.value = value,
.facet_var = name,
.facet_ncol = 2)covid_age_gender_df %>%
arrange(날짜)# A tibble: 2,949 x 7
날짜 구분 검사자 확진자 사망자 감염율 치명율
<date> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 2020-04-02 0-9 9825. 112 0 0.0114 0
2 2020-04-02 10-19 9791. 515 0 0.0526 0
3 2020-04-02 20-29 9786. 2656 0 0.271 0
4 2020-04-02 30-39 9787. 1012 1 0.103 0.0062
5 2020-04-02 40-49 9784. 1312 1 0.134 0.0062
6 2020-04-02 50-59 9788. 1851 10 0.189 0.0617
7 2020-04-02 60-69 9786. 1235 22 0.126 0.136
8 2020-04-02 70-79 9789. 651 46 0.0665 0.284
9 2020-04-02 80 이상 9779. 442 82 0.0452 0.506
10 2020-04-02 여성 9785. 5881 80 0.601 0.494
# ... with 2,939 more rows
covid_age_gender_df %>%
mutate(치명율 = 치명율 * 100) %>%
filter(!str_detect(구분, pattern = "(남성)|(여성)")) %>%
filter(!str_detect(구분, "(0-11)|(0-9)|(10-19)|(20-29)|(30-39)|(40-49)")) %>%
timetk::plot_time_series(.date_var = 날짜,
.value = 치명율,
.facet_var = 구분,
.interactive = FALSE,
.smooth = FALSE,
.facet_ncol = 4,
.facet_scales = "fixed")데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com